﻿//================================================
//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//
//
//================================================
//
// Created by Huiyi on 2021/4/20.
//
//@模块名称 易炫彩网络库
//@依赖   module_base.h
//@依赖   module_windowsApi.h
//@依赖   module_XExpand_String.h
//@依赖   module_XExpand_system.h
//@版本   1.3
//@日期   2022-11-14
//@作者   Huiyi
//@模块备注 封装常用网络操作指令
//项目gitee地址 https://gitee.com/LoveA/XL_XExpand
//大部分代码已经历过粗略测试
//如发现BUG可提交issues
//https://gitee.com/LoveA/XL_XExpand/issues
//反馈QQ群:594165459

#pragma once

#ifndef XL_XEXPAND_NETWORK_H
//@隐藏{
#define XL_XEXPAND_NETWORK_H    //防止复用
//#define XC_MOUDLE
#ifdef XC_MOUDLE
#include "module_base.h"
#include "module_windowsApi.h"
#include "module_XExpand_String.h"
#include "module_XExpand_system.h"

#endif
//@隐藏}

//#include <heapapi.h>
//#include <vector>
//#include <wininet.h>
#include <fstream>
#include <winhttp.h>
#pragma comment(lib, "winhttp.lib")
#pragma comment(lib, "Urlmon.lib")
#pragma comment(lib, "Kernel32.lib")
//#include <wininet.h>
//#pragma comment(lib, "wininet.lib")

//@src  "network.cpp"
//@src  "Network_haper.cpp"
//@src  "Nwtwork_Class_Winhttp.cpp"

#include "Network_haper.h"

//@分组{	WINHTTP

//@隐藏{
#define HTTP_BUFFER_LEN 10240
#define DwSize 4
#define WINHTTP_DEFAULT_VERSION 0
#define HTTP_BUFFER_LENMAX 1048576
//@隐藏}


//@别名 WinHttp类
class X_WinHttp {
private:
    CXText HostName;  //域名
    int Port;         //端口
    CXText UrlW;      //本次访问的Url （存储用于302解析）
    int Scheme;       //连接类型 http or https （存储用于302解析）
    bool IsPOST;

    LPVOID Dataptr;       //数据指针/缓冲区
    int ResponseBodylen;  //返回数据长度
    int ContentLength;    //返回数据预计长度

    CXText ResponseHeaders;  //返回协议头

    bool _Auto;        //自动模式
    int _AutoCookies;  // Cookies自动模式
    CXText _Cookies;   //模式1内部Cookies
    int _Cookieslen;   //整数型

    bool SetProxyInfo;  //标记=真 会在Send前设置下代理信息
    CXText SetProxyUser;
    CXText SetProxyPass;

    bool _IsIgnoreError;

    bool NeverRedirect;  //是否禁止自动重定向
    int _RedirectIndex;

    void __Create();

    void __Create(CXText User_Agent);

    void __Close();

    void __InitOptions();  //初始化一些默认配置选项
    void __UpCookies1(bool NopNullCookieName = false);  //处理并更新内部Cookies 1
    void __UpCookies2(
        bool NopNullCookieName = false);  //处理并更新本地IESCookies 2
    bool __SetCookies2(CXText Cookie);    // SetCookieIES
    bool __LoadCookies1();                //加载并设置内部Cookies 1
    bool __LoadCookies2();                //加载并设置本地IESCookies 2
    void __SetRequestHeaders(bool IsData);  // Send前自动处理补全必须协议头
    void __SetInternetInfo();               // Send前自动处理相关信息
    bool __GetQueryHeadersInfo(
        bool NopNullCookieName);  // Send后自动获取Headers信息并处理
    void __Redirect(bool NopNullCookieName,
        int SendRetryCount);  // AutoCookie自动递归处理重定向

public:
    HINTERNET hSession;  // 会话句柄
    HINTERNET hRequest;  //请求句柄
    HINTERNET hConnect;  //链接句柄

    X_WinHttp();
    X_WinHttp(CXText url);
    X_WinHttp(CXText url, CXText Method);
    ~X_WinHttp();

    //@备注  打开一个HTTP连接
    //@别名  打开(请求类型,请求地址)
    //@参数  Method  请求类型,例如:POST,GET,HEAD,默认GET
    //@参数  Url  请求地址,例如:http://www.xcgui.com
    bool Open(CXText Url, CXText Method = L"");

    //@备注  设置自动补全模式,此模式开启后会自动帮你补全必要的协议头
    //@别名  置自动补全模式(自动补全)
    //@参数  IsAuto  默认真,真=开启自动协议头补全 假=关闭自动协议头补全
    void Auto(bool IsAuto = true);

    //@备注  设置Cookies自动管理模式
    //@别名  置Cookies管理模式(模式)
    //@参数  Index 0=Winhttp内部自动处理Cookies,1=类内部自动合并更新Cookies(此模式下可以配合独有方法Cookies CookieAdd CookieSet CookieDel 来取/设/添加/设置/删除),2=缓存到本地(支持IES控件继承 注意:模式2不兼容多线程)
    void AutoCookies(int Index = 1);

    //@备注  重置(初始化)WinHttp 释放所有数据 包括之前所有设置和Cookies
    //@别名  重置(UA)
    //@参数  User_Agent 自定义用户浏览器协议头信息 User_Agent 留空则使用默认的浏览器信息
    void Rest(CXText User_Agent = L"");

    //@备注  发送HTTP请求
    //@别名 发送请求(提交数据,自动处理空Cookits,最大重试次数)
    //@参数  Data                提交数据,可以为空
    //@参数  NopNullCookieName   默认=假
    //自动更新Cookies时忽略掉Cookie键值为空的Cookie（必须在'非AutoCookies模式0'下使用）
    //@参数  SendRetryCount      默认=0 执行Send或Recv失败后 自动重试最大次数 0=关闭Send失败重试
    bool Send(CXTextA Data = "", bool NopNullCookieName = false,
        int SendRetryCount = 0);

    //@备注  发送HTTP请求字节集
    //@别名 发送字节集请求(提交数据,自动处理空Cookits,最大重试次数)
    //@参数  Data                提交数据,可以为空
    //@参数  NopNullCookieName   默认=假 自动更新Cookies时忽略掉Cookie键值为空的Cookie (必须在'非AutoCookies模式0'下使用)
    //@参数  SendRetryCount      默认=0 执行Send或Recv失败后 自动重试最大次数 0=关闭Send失败重试
    bool SendBin(CXBytes Data = "", bool NopNullCookieName = false,
        int SendRetryCount = 0);

    //@备注  取返回字节集 （必须在Send后使用）
    //@别名  取响应数据(返回数据)
    DWORD GetResponseBody(CXBytes& req);
    //@备注  取返回文本 （必须在Send后使用）
    //@别名  取响应文本(返回数据)
    DWORD GetResponseBodyText(CXText& req);
    //@备注  取返回文本 （自动Utf8转Ansi） （必须在Send后使用）
    //@别名  取响应文本_自动Utf8转Ansi(返回数据)
    DWORD GetResponseBodyTextUtf8ToAnsi(CXText& req);
    //@备注  取返回文本A （必须在Send后使用）
    //@别名  取响应文本A(返回数据)
    DWORD GetResponseBodyTextA(CXTextA& req);
    //@备注  取返回文本A （自动Utf8转Ansi） （必须在Send后使用）
    //@别名  取响应文本A_自动Utf8转Ansi(返回数据)
    DWORD GetResponseBodyTextAUtf8ToAnsi(CXTextA& req);

    //@备注  取状态码 （必须在Send后使用）
    //@别名  取状态码()
    int GetStatus();
    //@备注  取文本状态码 （必须在Send后使用）
    //@别名  取状态码文本()
    CXText GetStatusText();

    //@备注  取得所有HTTP返回协议头 （必须在Send后使用）
    //@别名  取所有协议头()
    CXText GetAllResponseHeaders();
    //@备注  取得HTTP返回协议头 （必须在Send后使用）
    //@别名  取协议头(协议头)
    CXText GetResponseHeader(CXText Header);

    //@备注  取得HTTP返回协议头中所有COOKIES （必须在Send后使用）
    //@别名  取所有COOKIES()
    CXText GetAllResponseCookies();
    //@备注  取得HTTP返回协议头中指定Cookie键的值 （必须在Send后使用）
    //@别名  取指定COOKIES(键名)
    //@参数  Name         Cookie键名
    CXText GetResponseCookie(CXText Name);

    //@备注  取得HTTP返回协议头中的302重定向地址 （必须在Send后使用）
    //@别名  取重定向地址(自动补全Url)
    //@参数  autobUrl     智能判断并补全url(协议头+域名+端口+路径）
    CXText GetResponseLocation(bool autobUrl = false);

    //@备注  指定超时设置 （设置后一直有效） （要想本次访问就生效 请在Open前调用）
    //@别名  置超时(解析超时,连接超时,发送超时,接收超时)
    //@参数  ResolveTimeout     解析超时，单位毫秒 留空=10000(10秒)
    //@参数  ConnectTimeout     连接超时，单位毫秒 留空=15000(15秒)
    //@参数  SendTimeout        发送超时，单位毫秒 留空=120000(120秒/2分钟)
    //@参数  ReceiveTimeout     接收超时，单位毫秒 留空=300000(300秒/5分钟) （注意：经测试 接收超时也会影响到POST上传超时）
    bool SetTimeouts(int ResolveTimeout = 10000, int ConnectTimeout = 15000, int SendTimeout = 120000, int ReceiveTimeout = 300000);

    //@备注  设置或取消代理 （设置后一直有效）
    //@别名  置代理(代理地址,代理帐号,代理密码)
    //@参数  Proxy    空=取消代理  HTTP代理="http=127.0.0.1:8080"  HTTPS代理=“127.0.0.1:8080”
    //@参数  User     代理帐号
    //@参数  Pass     代理密码
    bool SetProxy(CXText Proxy = L"", CXText User = L"", CXText Pass = L"");

    //@备注  指定身份验证凭据 （设置后一直有效） （必须在Open后使用）
    //@别名  置身份验证凭据(用户名,密码,认证目标,认证方式)
    //@参数  UserName     用户名
    //@参数  Password     密码
    //@参数  AuthTargets  认证目标：留空=0  0=设置登录帐号密码 1=设置代理帐号密码  常量：WINHTTP_AUTH_认证目标_
    //@参数  AuthScheme   认证方式：留空=1  常量：WINHTTP_AUTH_认证方式_
    bool SetCredentials(CXText UserName, CXText Password,
        int AuthTargets = WINHTTP_AUTH_TARGET_SERVER,
        int AuthScheme = WINHTTP_AUTH_SCHEME_BASIC);

    //@备注  设置WinHttp属性选项
    //@别名  置属性设置(属性类型,属性标志,属性指针,属性长度)
    //@参数  Type         属性类型  0=会话句柄 1=连接句柄 2=请求句柄
    //@参数  Option       属性标志
    //@参数  ValueBuffer  属性指针
    //@参数  属性长度     属性长度  sizeof(type)
    bool SetOption(int Type, int Option, LPVOID ValueBuffer, int BufferLength);

    //@备注  是否允许自动重定向 （设置后一直有效）
    //@别名  置允许重定向(是否允许重定向)
    void SetRedirect(bool IsRedirect = true);

    //@备注  添加或替换HTTP协议头 （本次访问有效） （必须在Open后使用）
    //@别名  置协议头(协议头名称,协议头值,标志)
    //@参数  Header       协议头名称
    //@参数  Value        协议头值 空文本为删除此协议头
    //@参数  Modifiers    标志 常量：WINHTTP_ADDREQ_FLAG_
    bool SetRequestHeader(CXText Header, CXText Value, int Modifiers = WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE);

    //@备注  删除HTTP协议头 （本次访问有效） （必须在Open后使用）
    //@别名  删除协议头(协议头名称)
    bool DelRequestHeader(CXText Header);

    //@备注  快速设置Cookie信息 （AutoCookies模式0下 必须在Open后使用）
    //@别名  置Cookie信息(Cookie)
    bool SetCookie(CXText Cookie);

    //@备注  快速设置User-Agent浏览器信息 （必须在Open后使用）
    //@别名  置UA信息(UA)
    bool SetUserAgent(CXText UserAgentValue = L"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2) ");

    //@备注  快速设置Referer来路信息 （必须在Open后使用）
    //@别名  置Referer信息(Url)
    bool SetReferer(CXText RefererValue = L"");

    //@备注  快速设置Accept信息 （必须在Open后使用）
    //@别名  置Accept信息(Accept)
    bool SetAccept(CXText AcceptValue = L"*/*");

    //@备注  快速设置SetAccept-Language信息 （必须在Open后使用）
    //@别名  置AcceptLanguage信息(AcceptLanguageValue)
    bool SetAcceptLanguage(CXText AcceptLanguageValue = L"zh-cn");

    //@备注  快速设置Content-Type信息 （必须在Open后使用）
    //@别名  置ContentType信息(ContentType)
    bool SetContentType(CXText ContentTypeValue = L"application/x-www-form-urlencoded");

    //@备注  快速设置x-requested-with 为 XMLHttpRequest （必须在Open后使用）
    //@别名  置XMLHttpRequest()
    bool SetXMLHttpRequest();

    //@备注  快速设置多重伪造IP协议头（包括：X-Forwarded-For,CLIENT_IP,VIA,REMOTE_ADDR） （必须在Open后使用
    //@别名  置FakeIP(IP)
    bool SetFakeIP(CXText FakeIP);

    //@别名  置协议头文本(协议头文本)
    void SetRequestHeaders(CXText Headers);

    //@备注  取/设内部Cookies （AutoCookies模式1下有效）
    //@别名  Cookies(Cookies)
    CXText Cookies(CXText NewCookies = L"");

    //@备注  获取内部Cookies中的某个Cookie （AutoCookies模式1下有效）
    //@别名  获取Cookies(键名,是否附带名称)
    CXText CookieGet(CXText Name, bool AddName = false);

    //@备注  添加或替换Cookie到内部Cookies （AutoCookies模式1下有效）
    //@别名  添加Cookie(Cookie)
    bool CookieAdd(CXText Cookie);

    //@备注  删除内部Cookies中的Cookie （AutoCookies模式1下有效）
    //@别名  删除Cookie(Cookie)
    //@参数  Cookie 单个或多个Cookie或Cookie名称 （例如：abc 或是 abc=123 或是 或是 abc; def;g 或是 abc=123; def=456;g=nima;id）
    bool CookieDel(CXText Cookie);
};





/*@声明

//@备注 验证目标：网站服务器。
//@别名 WINHTTP_AUTH_认证目标_网站服务器
#define WINHTTP_AUTH_TARGET_SERVER      0
//@备注 验证目标：代理服务器。
//@别名 WINHTTP_AUTH_认证目标_代理服务器
#define WINHTTP_AUTH_TARGET_PROXY       1       
//@备注 基本认证方式(BASE64加密)。
//@别名 WINHTTP_AUTH_认证方式_基本认证_BASE64加密
#define WINHTTP_AUTH_SCHEME_BASIC       1       
//@备注 NTLM认证方式。
//@别名 WINHTTP_AUTH_认证方式_NTLM认证
#define WINHTTP_AUTH_SCHEME_NTLM        2     
//@备注 PASSPORT认证方式。
//@别名 WINHTTP_AUTH_认证方式_PASSPORT认证
#define WINHTTP_AUTH_SCHEME_PASSPORT    4       
//@备注 DIGEST认证方式。
//@别名 WINHTTP_AUTH_认证方式_DIGEST认证
#define WINHTTP_AUTH_SCHEME_DIGEST      8       
//@备注 NTLM和Kerberos之间的认证方式。
//@别名 WINHTTP_AUTH_认证方式_NTLM_KERBEROS_中间认证
#define WINHTTP_AUTH_SCHEME_NEGOTIATE   16      
*/

/*@声明
//@参数 添加一个协议头，如果协议头已存在则被新值替换，与 WINHTTP_ADDREQ_FLAG_替换 标志一起使用。
//@别名 WINHTTP_ADDREQ_FLAG_添加
#define WINHTTP_ADDREQ_FLAG_ADD      536870912
//@参数 只有不存在的时候才添加
//@别名 WINHTTP_ADDREQ_FLAG_新建
#define WINHTTP_ADDREQ_FLAG_ADD_IF_NEW 268435456
//@参数 合并相同的名称
//@别名 WINHTTP_ADDREQ_FLAG_合并
#define WINHTTP_ADDREQ_FLAG_COALESCE    1073741824  
//@参数 合并相同的名称使用逗号
//@别名 WINHTTP_ADDREQ_FLAG_合并标记逗号
#define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA    1073741824  
//@参数 合并相同的名称使用分号
//@别名 WINHTTP_ADDREQ_FLAG_合并标记分号
#define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON    16777216  
//@别名 WINHTTP_ADDREQ_FLAG_替换
#define WINHTTP_ADDREQ_FLAG_REPLACE  2147483648
*/

//@分组}	WINHTTP

//@分组{	网页功能

//@备注 使用WinHttp的 API方式访问网页
//@参数 网址 完整的网页地址,必须包含http://或者https://
//@参数 请求方式  0=GET 1=POST 2=HEAD  3=PUT  4=OPTIONS  5=DELETE  6=TRACE  7=CONNECT
//@参数 提交信息 POST专用
//@参数 提交Cookies 设置提交时的cookie
//@参数 返回Cookies 返回的Cookie
//@参数 附加协议头 一行一个请用换行符隔开,建议填写常量值或文本值,防止因传参引发错误
//@参数 返回协议头 返回的协议头
//@参数 禁止重定向 默认不禁止网页重定向
//@参数 代理地址  代理地址，格式为 http=8.8.8.8:88
//@参数 代理账号 代理的验证账号
//@参数 代理密码 代理的验证密码
//@参数 是否补全必要协议头 当附件协议头为空时自动添加必要的UA协议头 默认为真，假将不再添加非传入协议头
//@参数 是否处理协议头大小写 将协议头中的键名首字母处理为大写  默认为真
//@参数 返回状态码 返回网页状态码,一般成功为200
//@参数 返回状态文本 错误状态文本
//@别名 网页_访问(网址,请求方式,提交信息,提交Cookies,返回Cookies,附加协议头,返回协议头,禁止重定向,代理地址,代理账号,代理密码,是否补全必要协议头,是否处理协议头大小写,返回状态码,返回状态码文本)
CXBytes X_NetWork_Visit(CXText Url, int Method=0,CXBytes* PostData=NULL,
    CXText* SendCookies=NULL, CXText* RespCookies = NULL,
    CXText* SendHeader = NULL, CXText* RespHeader = NULL,
    bool bBanRedirect=false, CXText* agentHost=NULL, CXText* agentName = NULL, CXText* agentPasswd = NULL,
    bool completionHeader=true,bool standardHeaders=true,
    int* rStatusCode = NULL, CXText* rStatusStr = NULL);

//@备注 将协议头中的键名首字母处理为大写
//@别名 网页_处理协议头(原始协议头)
CXText X_NetWork_CompletionHeaders(CXText header);
//@备注 将协议头中的键名首字母处理为大写
//@别名 网页_处理协议头A(原始协议头)
CXTextA X_NetWork_CompletionHeadersA(CXTextA header);

//@返回 成功返回文件尺寸,失败返回-1
//@别名 网页_取网络文件尺寸(欲取网络文件地址)
ULONGLONG X_NetWork_GetNetFileSize(CXText Url);
//@返回 成功返回文件尺寸,失败返回-1
//@别名 网页_取网络文件尺寸A(欲取网络文件地址)
ULONGLONG X_NetWork_GetNetFileSizeA(CXTextA Url);

//@别名 网页_IE浏览器网页跳转静音(是否静音)
void X_NetWork_IESkipMute(bool IsMute=true);

//@别名 网页_URL取本地地址(地址)
CXText X_NetWork_UrlGetLocalPath(CXText Url);

//@备注 创建网页快捷方式
//@参数 快捷方式文件名 扩展名为.url全路径
//@参数 网页地址
//@参数 ico图标
//@参数 快捷键 快捷键键代码
//@别名 网页_创建快捷方式(快捷方式文件名,网页地址,ico图标,快捷键)
BOOL X_NetWork_CreateShortcut(CXText FileName, CXText Url,CXText IconPath=L"", WORD HotKey = 0);
//@备注 创建网页快捷方式
//@参数 快捷方式文件名 扩展名为.url全路径
//@参数 网页地址
//@参数 ico图标
//@参数 快捷键 快捷键键代码
//@别名 网页_创建快捷方式A(快捷方式文件名,网页地址,ico图标,快捷键)
BOOL X_NetWork_CreateShortcutA(CXTextA FileName, CXTextA Url, CXTextA IconPath="", WORD HotKey=0);

//@备注 使用系统默认的浏览器打开一个网址
//@别名 网页_打开指定网址(网页地址)
void X_NetWork_OpenUrl(CXText url);
//@备注 使用系统默认的浏览器打开一个网址
//@别名 网页_打开指定网址A(网页地址)
void X_NetWork_OpenUrlA(CXTextA url);

//@备注 保存网页
//@别名 网页_保存(浏览器句柄)
void X_NetWork_Save(HWND hWnd);

//@备注 保存html文档
//@别名 网页_保存html文档(浏览器句柄)
void X_NetWork_SaveHTML(HWND hWnd);

//@别名 网页_查看网页属性(浏览器句柄)
void X_NetWork_ViewProperties(HWND hWnd);

//@别名 网页_查找关键字(浏览器句柄)
void X_NetWork_FindKeyword(HWND hWnd);

//@别名 网页_打印(浏览器句柄)
void X_NetWork_Print(HWND hWnd);

//@别名 网页_打印预览(浏览器句柄)
void X_NetWork_PrintView(HWND hWnd);

//@别名 IP归属地_易炫彩
struct X_IPAscription {
    //@别名 IP
    CXText IP;
    //@别名 国家
    CXText Country;
    //@别名 省份
    CXText Region;
    //@别名 城市
    CXText City;
    //@别名 运营商
    CXText Isp;
};
//@别名 IP归属地A_易炫彩
struct X_IPAscriptionA {
    //@别名 IP
    CXTextA IP;
    //@别名 国家
    CXTextA Country;
    //@别名 省份
    CXTextA Region;
    //@别名 城市
    CXTextA City;
    //@别名 运营商
    CXTextA Isp;
};
//@参数 查询IP 可空
//@别名 网页_取IP归属地(查询IP)
X_IPAscription X_NetWork_GetIPAscription(CXText IP=L"");
//@参数 查询IP 可空
//@别名 网页_取IP归属地A(查询IP)
X_IPAscriptionA X_NetWork_GetIPAscriptionA(CXTextA IP = "");

//@别名 网页_取编码(网页地址)
CXText X_NetWork_GetHtmlCodeing(CXText url);
//@别名 网页_取编码A(网页地址)
CXTextA X_NetWork_GetHtmlCodeingA(CXTextA url);

//@备注 从左往右获取
//@别名 网页_取单条Cookie(Cookie,名称,不附带名称)
CXText X_NetWork_GetCookie(CXText cookie, CXText Name, bool NoName = true);
//@备注 从左往右获取
//@别名 网页_取单条CookieA(Cookie,名称,不附带名称)
CXTextA X_NetWork_GetCookieA(CXTextA cookie, CXTextA Name, bool NoName = true);

//@备注 取出网站服务器的默认端口
//@别名 网页_取端口(网址)
UINT X_NetWork_GetPort(CXText url);
//@备注 取出网站服务器的默认端口
//@别名 网页_取端口A(网址)
UINT X_NetWork_GetPortA(CXTextA url);

//@备注 通过“/”或者“.”来获取网址中的域名，默认使用“/”方式
//@参数 网址
//@参数 去除二级域名
//@参数 不过滤端口
//@参数 后缀点数量 不留空表示通过“.”的方式取域名 。如：.com后缀点数量为1 ,.com.cn后缀点数量为2
//@别名 网页_取域名(网址,去除二级域名,不过滤端口,后缀点数量)
CXText X_NetWork_GetHost(CXText url, bool delSL=false, bool addPort=true, int suffixNum=0);
//@备注 通过“/”或者“.”来获取网址中的域名，默认使用“/”方式
//@参数 网址
//@参数 去除二级域名
//@参数 不过滤端口
//@参数 后缀点数量 不留空表示通过“.”的方式取域名 。如：.com后缀点数量为1 ,.com.cn后缀点数量为2
//@别名 网页_取域名A(网址,去除二级域名,不过滤端口,后缀点数量)
CXTextA X_NetWork_GetHostA(CXTextA url, bool delSL = false, bool addPort = false, int suffixNum = 0);

//@备注 取网页快捷方式的地址
//@参数 文件路径 快捷方式的地址
//@参数 缓冲区大小 返回缓冲区尺寸,默认2048,默认可空
//@别名 网页_取快捷方式地址(文件路径,缓冲区大小)
CXText X_NetWork_GetShortcut(CXText path,DWORD buffSize=2048);
//@备注 取网页快捷方式的地址
//@参数 文件路径 快捷方式的地址
//@参数 缓冲区大小 返回缓冲区尺寸,默认2048,默认可空
//@别名 网页_取快捷方式地址A(文件路径,缓冲区大小)
CXTextA X_NetWork_GetShortcutA(CXTextA path, DWORD buffSize = 2048);

//@备注 取特殊网络文件名
//@别名 网页_取网络文件名(网址)
CXText X_NetWork_GetFileName(CXText url);
//@备注 取特殊网络文件名
//@别名 网页_取网络文件名A(网址)
CXTextA X_NetWork_GetFileNameA(CXTextA url);

//@备注 取一个网站地址中的文件名
//@别名 网页_取网址文件名(网址)
CXText X_NetWork_GetUrlName(CXText url);
//@备注 取一个网站地址中的文件名
//@别名 网页_取网址文件名A(网址)
CXTextA X_NetWork_GetUrlNameA(CXTextA url);

//@备注 返回指定网址的页面地址
//@别名 网页_取页面地址(网址)
CXText X_NetWork_GetPath(CXText url);
//@备注 返回指定网址的页面地址
//@别名 网页_取页面地址A(网址)
CXTextA X_NetWork_GetPathA(CXTextA url);

//@别名 网页_全选(浏览器句柄)
void X_NetWork_SelectAll(HWND hWnd);

//@别名 网页_设置网页字体(浏览器句柄)
void X_NetWork_SetPageFonts(HWND hWnd);

//@别名 网页_网络文件是否存在(网络文件名)
bool X_NetWork_FileIfExistence(CXText url);
//@别名 网页_网络文件是否存在A(网络文件名)
bool X_NetWork_FileIfExistenceA(CXTextA url);

//@备注 取出协议头中的某个值 例如302跳转协议头中的 Location
//@参数 源协议头 协议头文本
//@参数 键名 例如：Location
//@别名 网页_取协议头信息(源协议头,键名)
CXText X_NetWork_GetHeaderInfo(CXText Headers, CXText Key);
//@备注 取出协议头中的某个值 例如302跳转协议头中的 Location
//@参数 源协议头 协议头文本
//@参数 键名 例如：Location
//@别名 网页_取协议头信息A(源协议头,键名)
CXTextA X_NetWork_GetHeaderInfoA(CXTextA Headers, CXTextA Key);

//@备注 设置当前程序中浏览器的UserAgent,不影响外部浏览器使用
//@别名 网页_置浏览器UA(UserAgent)
bool X_NetWork_SetBrowserUA(CXText UserAgent);
//@备注 设置当前程序中浏览器的UserAgent,不影响外部浏览器使用
//@别名 网页_置浏览器UAA(UserAgent)
bool X_NetWork_SetBrowserUAA(CXTextA UserAgent);

//@备注 取出指定网址中所有的键名和键值，返回取到的数量
//@返回 返回参数数量
//@参数 链接 带取参数的链接,必须是转码之后的链接
//@参数 返回数据 存储参数对的字典:map<Key,Value>
//@别名 网址_取所有参数(链接,返回数据)
int X_NetWork_GetAllParameter(CXText Url, CXMap<CXText, CXText>& ret);
//@备注 取出指定网址中所有的键名和键值，返回取到的数量
//@返回 返回参数数量
//@参数 链接 带取参数的链接,必须是转码之后的链接
//@参数 返回数据 存储参数对的字典:map<Key,Value>
//@别名 网址_取所有参数A(链接,返回数据)
int X_NetWork_GetAllParameterA(CXTextA Url, CXMap<CXTextA, CXTextA>& ret);

/*@声明

//@别名 网页_是否为网页(网页地址)
BOOL PathIsURLW(LPCWSTR pszPath);

*/

//@分组}	网页功能


//@隐藏{

//窗口_查找网页句柄
void X_NetWork_FindNetWorkHwnd(HWND hWnd, HWND& hwndSDV, HWND& hwndIES);
void X_NetWork_SendMessage(HWND hWnd, int cType, int id);
CXText _X_NetWork_GetCookie(CXText cookie, CXText cookieName);
CXTextA _X_NetWork_GetCookieA(CXTextA cookie, CXTextA cookieName);
//@隐藏}


#endif //XL_XEXPAND_NETWORK_H
